const fs = require('fs');
const path = require('path');

/**
 * 通用文件读取方法
 * @param {string} filePath 文件路径(相对或绝对路径)
 * @returns {Promise<string>} 文件内容
 * @throws {Error} 如果文件不存在或读取失败
 */
function readFile(filePath) {
  try {
    // 解析为绝对路径
    const absolutePath = path.isAbsolute(filePath) 
      ? filePath 
      : path.join(process.cwd(), filePath);
    
    // 检查文件是否存在
    if (!fs.existsSync(absolutePath)) {
      throw new Error(`文件不存在: ${absolutePath}`);
    }

    // 同步读取文件内容
    return fs.readFileSync(absolutePath, 'utf-8');
  } catch (error) {
    console.error(`读取文件失败: ${filePath}`, error);
    throw error;
  }
}


/**
 * 将文本内容写入文件
 * @param {string} content - 要写入的文本内容
 * @param {string} filePath - 文件路径
 * @returns {Promise<void>} - 返回一个Promise，写入完成后resolve
 */
function writeTextToFile(content, filePath) {
    return new Promise((resolve, reject) => {
        fs.writeFile(filePath, content, 'utf8', (err) => {
            if (err) {
                reject(err); // 如果出现错误，则reject
            } else {
                resolve(); // 成功写入后resolve
            }
        });
    });
}




/**
 * 异步复制文件（支持目录自动创建）
 * @param {string} sourcePath 源文件路径
 * @param {string} targetPath 目标文件路径
 * @returns {Promise<void>}
 */
async function copyFileAsync(sourcePath, targetPath) {
    try {
        // 确保目标目录存在
        // const targetDir = path.dirname(targetPath);
        // console.log(targetDir, 21378)
        // await fs.mkdir(targetDir, { recursive: true });

        // 复制文件
        await fs.copyFileSync(sourcePath, targetPath);
        console.log(`文件复制成功: ${sourcePath} -> ${targetPath}`);
    } catch (error) {
        console.error('文件复制失败:', error);
        throw error; // 重新抛出错误以便调用方处理
    }
}


/**
 * 全局替换字符串中的所有匹配项
 * @param {string} text - 原始文本
 * @param {string} searchStr - 需要被替换的子串
 * @param {string} replaceStr - 替换后的子串
 * @returns {string} 替换后的文本
 */
function replaceAll(text, searchStr, replaceStr) {
    // 处理空值或无效输入
    if (typeof text !== 'string' || typeof searchStr !== 'string') {
        throw new TypeError('参数必须为字符串类型');
    }
    if (searchStr === '') {
        return text; // 空字符串无意义，直接返回原文本
    }

    // 使用正则表达式实现全局替换（兼容所有浏览器）
    const regex = new RegExp(escapeRegExp(searchStr), 'g');
    console.log(text.replace(regex, replaceStr), 281)
    return text.replace(regex, replaceStr);
}

/**
 * 转义正则表达式特殊字符
 * @param {string} str - 需要转义的字符串
 * @returns {string} 转义后的字符串
 */
function escapeRegExp(str) {
    return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

module.exports = {
  readFile,
  copyFileAsync,
  writeTextToFile,
  replaceAll
};